package com.mingtu.guards.activity;

import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.blankj.utilcode.util.SPStaticUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;
import com.mingtu.common.callback.StringDialogCallback;
import com.hjq.gson.factory.GsonFactory;
import com.mingtu.common.utils.Constant;
import com.mingtu.common.utils.ConvertLatlng;
import com.mingtu.common.utils.IntentUtils;
import com.mingtu.common.utils.SPTools;
import com.mingtu.common.view.MultiGridView;
import com.mingtu.guards.R;
import com.mingtu.guards.adapter.InfraredAdapter;
import com.mingtu.guards.base.MyBaseActivity;
import com.mingtu.guards.bean.InfraredBubbleInfoBean;
import com.mingtu.guards.bean.InfraredDequiBean;
import com.mingtu.guards.utils.MarkerOptionsUtils;
import com.mingtu.guards.utils.MyConstant;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;

import static com.mingtu.common.utils.MyUtills.getBounds;
import static com.mingtu.guards.utils.MyConstant.INFO_WINDOW_OFF_SET_Y;
import static com.mingtu.guards.utils.MyConstant.MAX_ZOOM;

public class InfraredMonitorActivity extends MyBaseActivity implements AMap.OnMarkerClickListener,
        AMap.InfoWindowAdapter, AMap.OnInfoWindowClickListener, AMap.OnMapTouchListener {

    @BindView(R.id.mapView)
    MapView mapView;
    @BindView(R.id.tv_total_num)
    TextView tvTotalNum;
    @BindView(R.id.tv_online_num)
    TextView tvOnlineNum;
    @BindView(R.id.tv_offline_num)
    TextView tvOfflineNum;
    @BindView(R.id.tv_day_num)
    TextView tvDayNum;
    @BindView(R.id.grid_view)
    MultiGridView gridView;
    @BindView(R.id.srl_up)
    SmartRefreshLayout srlUp;
    @BindView(R.id.iv_zoom)
    ImageView ivZoom;
    private AMap aMap;
    private List<Marker> markerList = new ArrayList<>();
    private ArrayList<Marker> dequiMarker = new ArrayList<>();
    private View infoWindow;
    private LatLng location;
    private Marker clickMarker;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_infrared_monitor;
    }

    @Override
    protected void initView() {
        setModuleTitle("红外监测");
        super.initView();
    }

    @Override
    protected void initData() {
        InfraredAdapter infraredAdapter = new InfraredAdapter(context);
        gridView.setAdapter(infraredAdapter);
        infraredAdapter.setOnItemClickListener(new InfraredAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                if (position == 0) {//实时监测
                    Bundle bundle = new Bundle();
                    bundle.putString("cameraName", null);
                    IntentUtils.getInstance().readyGo(InfraredMonitorActivity.this, InfraredRecordPictureActivity.class, bundle);
                } else if (position == 1) {//数据分析
                    IntentUtils.getInstance().readyGo(InfraredMonitorActivity.this, InfrareDataAnalysisActivity.class);
                } else if (position == 2) {//设备管理
                    IntentUtils.getInstance().readyGo(InfraredMonitorActivity.this, InfrareDequipmentActivity.class);
                } else if (position == 3) {//预警记录
                    IntentUtils.getInstance().readyGo(InfraredMonitorActivity.this, WarningRecordActivity.class);
                }
            }
        });
    }

    @Override
    protected void initMap(Bundle savedInstanceState) {
        super.initMap(savedInstanceState);
        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        aMap = mapView.getMap();
        //地图模式可选类型：MAP_TYPE_NORMAL,MAP_TYPE_SATELLITE,MAP_TYPE_NIGHT
        aMap.setMapType(AMap.MAP_TYPE_NORMAL);// 矢量地图模式
        aMap.getUiSettings().setMyLocationButtonEnabled(false);// 设置默认定位按钮是否显示
        aMap.getUiSettings().setZoomControlsEnabled(false);
        aMap.setMaxZoomLevel(MAX_ZOOM);
        //地图在手机上的区域有限，暂时隐藏
        aMap.setInfoWindowAdapter(this);
        aMap.setOnMarkerClickListener(this);
        aMap.setOnInfoWindowClickListener(this);
        aMap.setOnMapTouchListener(this);
        aMap.moveCamera(CameraUpdateFactory.zoomTo(Constant.MAP_ZOOM_TWO));
        aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {
            @Override
            public void onMapLoaded() {
                getDequiList();
            }
        });
        String longitude = SPStaticUtils.getString(SPTools.lng);
        String latitude = SPStaticUtils.getString(SPTools.lat);
        if (!StringUtils.isEmpty(longitude) && !StringUtils.isEmpty(latitude)) {
            location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));
            //添加Marker
            MarkerOptions markerOptions = new MarkerOptions()
                    .position(location)
                    .icon(BitmapDescriptorFactory.fromResource(com.mingtu.home.R.mipmap.sb_icon_wz))
                    .infoWindowEnable(false);
            Marker marker = aMap.addMarker(markerOptions);
            markerList.add(marker);
            aMap.moveCamera(CameraUpdateFactory.changeLatLng(location));
        }
    }

    @Override
    protected void getData() {
        initPullRefresh();
        getInfraredCameraCount();
    }

    @Override
    protected void onDestroy() {
        if (aMap != null) {
            mapView.onDestroy();
        }

        if (markerList.size() > 0) {
            for (Marker marker : markerList) {
                marker.remove();
            }
            markerList.clear();
        }

        if (dequiMarker.size() > 0) {
            for (Marker marker : dequiMarker) {
                marker.remove();
            }
            dequiMarker.clear();
        }

        super.onDestroy();
    }

    @OnClick(R.id.iv_zoom)
    public void onViewClicked(View v) {
        switch (v.getId()) {
            case R.id.iv_zoom:
                IntentUtils.getInstance().readyGo(InfraredMonitorActivity.this, InfraredMapActivity.class);
                break;
        }
    }

    @Override
    public View getInfoWindow(Marker marker) {
        if (infoWindow == null) {
            infoWindow = LayoutInflater.from(this).inflate(R.layout.bubble_view2, null);
        }

        return render(marker, infoWindow);
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
//        marker.hideInfoWindow();
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        marker.showInfoWindow();
        clickMarker = marker;
        return false;
    }

    @Override
    public void onTouch(MotionEvent motionEvent) {
        if (clickMarker != null) {
            boolean b = clickMarker.isInfoWindowShown();
            if (b) {
                clickMarker.hideInfoWindow();
            }
        }
    }

    /**
     * 自定义infowinfow窗口
     */
    public View render(Marker marker, View view) {
        String infraredInfo = marker.getTitle();
        Gson gson = GsonFactory.getSingletonGson();
        InfraredBubbleInfoBean infraredBubbleInfoBean = new InfraredBubbleInfoBean();
        infraredBubbleInfoBean = gson.fromJson(infraredInfo, InfraredBubbleInfoBean.class);

        String cameraName = infraredBubbleInfoBean.getCameraName();

        TextView title = ((TextView) view.findViewById(R.id.title));
        title.setText(cameraName);

        LinearLayout layoutMarker = (LinearLayout) view.findViewById(R.id.layout);
        layoutMarker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //防止点击事件和touch事件冲突，所以采用此种方式跳转
                LatLng latLng = marker.getPosition();
                String lngStr = latLng.longitude + "";
                String latStr = latLng.latitude + "";
                Bundle bundle = new Bundle();
                bundle.putString("lng", lngStr);
                bundle.putString("lat", latStr);
                bundle.putBoolean("isFire", false);
                IntentUtils.getInstance().readyGo(ActivityUtils.getTopActivity(), NaviMapActivity.class, bundle);
            }
        });

        return view;
    }


    private void initPullRefresh() {
        srlUp.setEnableLoadMore(false);
        srlUp.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);
        srlUp.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                srlUp.finishRefresh(Constant.REFRESH_TIME);
                srlUp.setNoMoreData(false);
                getInfraredCameraCount();
                getDequiList();
            }
        });
    }

    /**
     * 相机统计数据
     */
    private void getInfraredCameraCount() {
        OkGo.<String>post(MyConstant.POST_INF_CAMERA_COUNT)
                .tag(this)
                .upJson("")
                .execute(new StringDialogCallback(this) {
                    @Override
                    public void onSuccess(Response<String> response) {
                        String result = response.body();
                        if (!StringUtils.isEmpty(result)) {//{"msg":"success","code":0,"data":{"offline":2,"total":6,"online":4,"days":28}}
                            JSONObject jsonObject = JSON.parseObject(result);
                            String msg = jsonObject.getString("msg");
                            if (msg.equals(Constant.RESULT_SUCCESS)) {
                                JSONObject dataObject = jsonObject.getJSONObject("data");
                                if (dataObject != null) {
                                    String offline = dataObject.getString("offline");
                                    String total = dataObject.getString("total");
                                    String online = dataObject.getString("online");
                                    String days = dataObject.getString("days");

                                    if (!StringUtils.isEmpty(total)) {
                                        tvTotalNum.setText("设备总数：" + total + "台");
                                    }
                                    if (!StringUtils.isEmpty(online)) {
                                        tvOnlineNum.setText("在线：" + online + "台");
                                    }

                                    if (!StringUtils.isEmpty(offline)) {
                                        tvOfflineNum.setText("离线：" + offline + "台");
                                    }

                                    if (!StringUtils.isEmpty(days)) {
                                        tvDayNum.setText("累计监测天数：" + days + "天");
                                    }

                                }
                            }
                        }
                    }
                });
    }

    /**
     * 设备信息
     */
    private void getDequiList() {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("curPage", 1);
        hashMap.put("pageSize", 500);
        String str = GsonUtils.toJson(hashMap);
        OkGo.<String>post(MyConstant.POST_INF_DEQUI_LIST)
                .tag(this)
                .upJson(str)
                .execute(new StringDialogCallback(this) {
                    @Override
                    public void onSuccess(Response<String> response) {
                        String result = response.body();
                        if (!StringUtils.isEmpty(result)) {

                            InfraredDequiBean infraredDequiBean = null;
                            try {
                                Gson gson = GsonFactory.getSingletonGson();
                                infraredDequiBean = new InfraredDequiBean();
                                infraredDequiBean = gson.fromJson(result, InfraredDequiBean.class);
                                List<InfraredDequiBean.DataBean.ListBean> dataBeans = infraredDequiBean.getData().getList();
                                if (dataBeans != null) {
                                    int size = dataBeans.size();
                                    if (size > 0) {
                                        List<LatLng> latLngs = new ArrayList<>();

                                        ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
                                        ApplicationInfo appInfo = getApplicationInfo();
                                        for (int i = 1; i <= 24; i++) {
                                            int resID = getResources().getIdentifier("icon_infrared" + i, "mipmap", appInfo.packageName);
                                            giflist.add(BitmapDescriptorFactory.fromResource(resID));
                                        }


                                        for (int i = 0; i < size; i++) {
                                            InfraredDequiBean.DataBean.ListBean listBean = dataBeans.get(i);
                                            String latitude = listBean.getLatitude();
                                            String longitude = listBean.getLongitude();

                                            if (!StringUtils.isEmpty(latitude) && !StringUtils.isEmpty(longitude)) {

                                                String cameraName = listBean.getCameraName();
                                                String cameraCode = listBean.getCameraCode();
                                                String updateTime = listBean.getUpdateTime();
                                                int status = listBean.getStatus();//状态 2：离线  1：在线
                                                int picCount = listBean.getPicCount();
                                                int batteryLevel = listBean.getBatteryLevel();


                                                double lat = Double.parseDouble(latitude);
                                                double lng = Double.parseDouble(longitude);
                                                String myLng = ConvertLatlng.getInstance().convertToSexagesimal(lng);
                                                String myLat = ConvertLatlng.getInstance().convertToSexagesimal(lat);


                                                HashMap<String, Object> myHashMap = new HashMap<>();
                                                myHashMap.put("cameraName", cameraName);
                                                myHashMap.put("cameraCode", cameraCode);
                                                myHashMap.put("updateTime", updateTime);
                                                myHashMap.put("batteryLevel", batteryLevel);
                                                myHashMap.put("status", status);
                                                myHashMap.put("picCount", picCount + "");
                                                myHashMap.put("location", myLat + "," + myLng);
                                                String infraredInfo = GsonUtils.toJson(myHashMap);

                                                LatLng location = new LatLng(lat, lng);
                                                latLngs.add(location);
                                                //添加Marker
                                                if (status == 1) {
                                                    Marker marker = aMap.addMarker(MarkerOptionsUtils.getMarkerOptions2(location, infraredInfo, INFO_WINDOW_OFF_SET_Y, giflist).infoWindowEnable(true));
                                                    dequiMarker.add(marker);
                                                } else if (status == 2) {
                                                    Marker marker = aMap.addMarker(MarkerOptionsUtils.getMarkerOptions1(location, infraredInfo, INFO_WINDOW_OFF_SET_Y, R.mipmap.icon_infrared_offline).infoWindowEnable(true));
                                                    dequiMarker.add(marker);
                                                }
                                            }
                                        }
                                        if (latLngs.size() > 0) {
                                            aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(getBounds(latLngs), 200));
                                        }
                                    }
                                }
                            } catch (JsonSyntaxException e) {
                                e.printStackTrace();
                                ToastUtils.showLong(getResources().getString(R.string.text_json_error));
                            }
                        }
                    }
                });
    }


}